home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 8 / FM Towns Free Software Collection 8.iso / t_os / pao / etc / bat_tool / drivechk.c < prev    next >
Text File  |  1994-06-01  |  3KB  |  111 lines

  1. /*
  2. *    バッチファイル用ドライブチェックプログラム
  3. *
  4. *    Usage: drivechk パス名 [リトライ回数]
  5. */
  6.  
  7. #include <stdio.h>            /*  printf()    */
  8. #include <string.h>            /*  strlen()    */
  9. #include <stdlib.h>            /*  atoi()        */
  10. #include <dos.h>            /*  _dos*(),_harderr()    */
  11. #include <signal.h>            /*    signal()    */
  12. #include <time.h>            /*    clock(),CLK_TCK    */
  13.  
  14. #define    FERR_CRITICAL        (-1)
  15. unsigned    Criticalerr = FERR_CRITICAL ;        /*  致命的エラー処理コード    */
  16.  
  17. static void far critical_handler( unsigned devcode,unsigned code,unsigned dev )
  18. /*===========================================================================
  19. *    致命的エラーのマスク処理用ハンドラ
  20. ===========================================================================*/
  21. {
  22.     devcode = dev = 0 ;                            /*  ノーチェック(手抜き)        */
  23.     Criticalerr = code ;
  24.     _hardresume( _HARDERR_FAIL ) ;                /*  中断(ファンクションコール失敗)*/
  25. }
  26.  
  27. static int drivechk( char *path )
  28. /*===========================================================================
  29. *    ドライブチェック
  30. *    < IN  >    : path    ドライブ名を含むパス名
  31. *    < RET >    : エラーコードを返す.
  32. *            : =0    正常終了
  33. *            : =1    ドライブ変更不可
  34. ===========================================================================*/
  35. {
  36.     unsigned    ndrv ;
  37.     struct find_t    dta ;
  38.     unsigned    drvno, chkdrvno, nowdrv ;
  39.     int        ret ;
  40.  
  41.     Criticalerr = FERR_CRITICAL ;
  42.     ret = 0 ;
  43.     _dos_getdrive( &nowdrv ) ;
  44.     if ( strlen( path ) ) {                        /*  ドライブ移動            */
  45.         if ( path[0] >= 'a' && path[0] <= 'z' ) path[0] -= ' ' ;
  46.         drvno = path[0] - '@' ;
  47.         _dos_setdrive( drvno,&ndrv ) ;
  48.         _dos_getdrive( &chkdrvno ) ;
  49.         _dos_findfirst( "*.*",_A_NORMAL,&dta ) ;
  50.         if ( drvno != chkdrvno ) ret = 1 ;
  51.     }
  52.     _dos_setdrive( nowdrv,&ndrv ) ;
  53.     if ( Criticalerr != FERR_CRITICAL ) ret = 1 ;
  54.  
  55.     return ( ret ) ;
  56. }
  57.  
  58. void wait( int cnt )
  59. /*===========================================================================
  60. *    指定された時間停止する.
  61. *    < IN  >    : cnt    待ち時間(1/100秒単位)
  62. ===========================================================================*/
  63. {
  64.     double    wait, elaps ;
  65.     clock_t st=clock() ;
  66.  
  67.     wait = (double)cnt / 100.0L ;
  68.     do {
  69.         elaps = (double)( clock() - st ) ;
  70.         if ( elaps < 0.0L ) elaps *= -1.0L ;
  71.         elaps /= (double)CLK_TCK ;
  72.     } while ( elaps < wait ) ;
  73. }
  74.  
  75. int main( int ac,char *av[] )
  76. /*===========================================================================
  77. *    メイン
  78. ===========================================================================*/
  79. {
  80.     register int    ret, cnt ;
  81.     int        chkcnt=0 ;
  82.  
  83.     /*  INT23h,INT24hのマスク処理
  84.     --------------------------- */
  85.     signal( SIGINT,SIG_IGN ) ;
  86.     _harderr( critical_handler ) ;
  87.  
  88.     if ( ac > 1 ) {                                /*  引数あり            */
  89.         if ( ac > 2 ) chkcnt = atoi( av[2] ) ;
  90.         chkcnt++ ;
  91.         if ( chkcnt < 1 ) chkcnt = 1 ;
  92.         for ( cnt=0; cnt<chkcnt; cnt++ ) {
  93.             ret = drivechk( av[1] ) ;
  94.             if ( !ret ) break ;
  95.             printf( "\a" ) ;
  96.             wait( 1 ) ;                            /*  1/100 sec wait        */
  97.         }
  98.         printf( "ドライブチェック : " ) ;
  99.         printf( ret ? "NG!\n" : "OK.\n" ) ;
  100.         if ( Criticalerr != FERR_CRITICAL )
  101.             printf( "致命的エラー発生 : error=%d(%02Xh)\n",Criticalerr,\
  102.                                                             Criticalerr ) ;
  103.         return ( ret ) ;
  104.     } else {                                    /*  引数なし            */
  105.         printf( "Usage: drivechk パス名 [試行回数]\n" ) ;
  106.         printf( "       試行回数の省略値は, 0 です.\n" ) ;
  107.         return ( 0 ) ;
  108.     }
  109. }
  110.  
  111.